import pdb
from datetime import datetime
# 从 pypinyin 库导入 pinyin 函数和 Style 类，用于将中文转换为拼音
from pypinyin import pinyin, Style
# 从 sqlalchemy 导入 func 函数，用于数据库操作中的函数调用，如获取当前时间
from sqlalchemy import func
# 从 app.models 模块导入数据库实例
from app.models import db


class Station(db.Model):
    """
    定义 Station 模型，对应数据库中的 'station' 表，用于存储车站信息。
    """
    __tablename__ = 'station'

    # 定义车站 ID 列，作为主键，自增整数类型
    id = db.Column(db.Integer, primary_key=True)
    # 定义车站名称列，最大长度为 120 的字符串类型，唯一且不能为空，添加索引以提高查询效率
    name = db.Column(db.String(120), unique=True, nullable=False, index=True)
    # 定义车站名称的拼音列，最大长度为 120 的字符串类型
    pinyin = db.Column(db.String(120))
    # 定义车站所在省份列，最大长度为 120 的字符串类型
    province = db.Column(db.String(120))
    # 定义车站所在城市列，最大长度为 120 的字符串类型
    city = db.Column(db.String(120))
    # 定义车站所在地区列，最大长度为 120 的字符串类型
    district = db.Column(db.String(120))
    # 定义车站记录创建时间列，日期时间类型，默认值为当前时间
    created_at = db.Column(db.DateTime, default=func.now())
    # 定义车站记录更新时间列，日期时间类型，默认值为当前时间
    updated_at = db.Column(db.DateTime, default=func.now())

    def __repr__(self):
        """
        返回一个可打印的字符串表示该车站对象，方便调试和日志记录。

        :return: 包含车站名称的字符串
        """
        return f'<Station {self.name}>'

    @classmethod
    def create(cls, data):
        """
        根据传入的数据创建新的车站记录。

        :param data: 包含车站信息的字典，如名称、省份、城市等
        :return: 创建成功的车站对象
        """
        # 创建新的车站对象
        station = cls(
            name=data.get('name'),
            # 将车站名称转换为大写拼音并拼接成字符串
            pinyin=''.join([item[0] for item in pinyin(data.get('name'), style=Style.NORMAL)]).upper(),
            province=data.get('province'),
            city=data.get('city'),
            # 原代码这里使用了未导入的 datetime，应改为 func.now()
            # created_at=datetime.now(),
            created_at=func.now(),
            # 原代码这里使用了未导入的 datetime，应改为 func.now()
            # updated_at=datetime.now(),
            updated_at=func.now(),
        )
        # 将新车站对象添加到数据库会话
        db.session.add(station)
        # 提交数据库会话，将更改保存到数据库
        db.session.commit()
        return station

    @classmethod
    def destroy(cls, station_id):
        """
        根据车站 ID 删除对应的车站记录。

        :param station_id: 要删除的车站 ID
        :return: 如果删除成功返回 True，否则返回 False
        """
        # 根据车站 ID 查询车站记录
        station = cls.query.get(station_id)
        if station:
            # 如果记录存在，从数据库会话中删除该车站对象
            db.session.delete(station)
            # 提交数据库会话，将更改保存到数据库
            db.session.commit()
            return True
        return False
